﻿using System;

namespace AladdinGameFramework.Event
{
	/// <summary>
	/// 时间管理器接口
	/// </summary>
	public interface IEventManager
	{
		/// <summary>
		/// 获取事件数量
		/// </summary>
		int Count
		{
			get;
		}

		/// <summary>
		/// 检查订阅事件处理函数
		/// </summary>
		/// <param name="id">事件类型编号</param>
		/// <param name="handler">要检查的事件处理函数</param>
		/// <returns>是否存在事件处理函数</returns>
		bool Check(int id, EventHandler<GameEventAgrs> handler);

		/// <summary>
		/// 订阅事件处理函数
		/// </summary>
		/// <param name="id">事件类型编号</param>
		/// <param name="handler">要订阅的事件处理函数</param>
		void Subscribe(int id, EventHandler<GameEventAgrs> handler);

		/// <summary>
		/// 取消订阅事件处理函数
		/// </summary>
		/// <param name="id">事件类型编号</param>
		/// <param name="handler">要取消订阅的事件处理函数</param>
		void Unsubscribe(int id, EventHandler<GameEventAgrs> handler);

		/// <summary>
		/// 抛出事件，这个操作是线程安全的，即使不存在主线程中抛出，也可保证在主线程中回调事件处理函数，但事件会在抛出后的下一帧分发
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		void Fire(object sender, GameEventAgrs e);

		/// <summary>
		/// 抛出事件立即模式，这个操作不是线程安全的，事件会立刻分发
		/// </summary>
		/// <param name="sender"></param>
		/// <param name="e"></param>
		void FireNow(object sender, GameEventAgrs e);
	}
}
